from gui.gui_car_base import GuiCarBase


class MainCar(GuiCarBase):

    def __init__(self):
        super().__init__()

        # region 自定义全局（类）变量
        """
            建议自定义全局变量放在下面
        """
        # 建立一个自定义全局变量
        self.p_offset = 0

        # endregion

    def e_image_init(self, **kwargs):
        """
            图像每一帧初始化完毕触发此事件
            此事件参数没有值
            如果你需要在图像初始完毕后控制小车，请在下面编写程序
        """
        print("e_image_init")
        # 控制程序在下方：

    def e_recognition(self, **kwargs):
        """
            识别对象的事件，当程序发现一个以上可识别对象时，触发本事件
            事件参数是一个包括所有可识别对象Object（详见od目录下object.py）信息的列表
            你可以通过以下语句得到一个列表
            object_list=kwargs['objects_list']
            你可以通过调用Recognition类的object_appeared函数检测判断可识别对象

        """
        # 以下程序演示了怎样实现可识别对象的判断，并对小车进行控制。
        # 判断标签ID为1，宽度大于等于40的对象是否出现，如果出现，控制小车进行避障动作
        # 第三个参数10是表示如果对象出现，10秒内不重复检测
        # if self.recognition.object_appeared(1, 40, 10):
        #     self.car_controller.bypass_obstacle(0.8, 2.7)
        print("e_recognition")

    def e_follow_line(self, **kwargs):
        """
            巡线事件，该事件每帧触发一次
            事件参数是一个引导线偏离图像中心点的偏移值，你可以使用以下语句获取该值
            offset = kwargs['offset']
            你可以调用car_controller对象的follow_line函数，赋值偏移值，进行巡线。
        """
        # 以下程序，演示了怎样利用偏离值进行小车巡线
        # 先获取偏离值
        # offset = kwargs['offset']
        # 当摄像头拍摄不到白线时，偏移值是-1000，这是通过程序对该值进行特殊处理
        # if offset == -1000:
        #     offset = self.p_offset * 1.6
        # else:
        #     self.p_offset = offset
        # 控制小车巡线
        # self.car_controller.follow_line(offset)

        print("e_flowing")

    def e_find_intersection(self, **kwargs):
        """
            发现路口时触发本事件
            事件参数是返回当前路口的编号，以起点开始计算，第一个路口，该值为1，第二个路口，值为2，以此类推。
            你可以使用以下语句获取该值
            number = kwargs['intersection_number']
        """
        # 以下程序演示了怎样根据发现路口的信息，控制小车转弯
        # 获取当前的路口编号
        # number = kwargs['intersection_number']
        # 根据路口编号进行转弯动作
        # if number == 1:
        #     self.car_controller.turn(True, 1.2)
        # if number == 5:
        #     self.car_controller.turn(False, 1)

        print("e_find_intersection")

    def e_find_zebra_crossing(self, **kwargs):
        """
            发现斑马线时触发本事件
            事件参数没有值
        """
        # 以下程序演示了发现斑马线时，小车在斑马线前暂停5秒
        # self.car_controller.stop(5)

        print("e_find_zebra_crossing")

    def e_find_roadblock(self, **kwargs):
        """
            当使用巡线摄像头发现障碍物时触发事件
            事件参数没有值
        """
        # 以下程序演示了，检测到单一颜色障碍物时，进行避障动作
        # self.car_controller.bypass_obstacle(0.8, 2.7)
        print("e_find_roadblock")


if __name__ == '__main__':
    # 建立对象
    car = MainCar()
    # 进入主循环，等待按下键盘Q键，退出主循环
    car.main_loop()
    # 手动清理对象，并退出程序
    car.close()
